package cn.org.xuanguang.kepler.hormos.rdb.executor;


import cn.org.xuanguang.kepler.hormos.rdb.dml.warrper.ResultWrapper;
import cn.org.xuanguang.kepler.hormos.rdb.dml.warrper.ResultWrappers;
import cn.org.xuanguang.kepler.hormos.rdb.dsl.sql.SqlRequest;
import cn.org.xuanguang.kepler.hormos.rdb.dsl.sql.SqlRequests;
import cn.org.xuanguang.kepler.metadata.enums.DataSourceType;

import java.util.List;
import java.util.Map;

public interface SyncSqlExecutor {


    public DataSourceType getDataSourceType();

    /**
     * 执行更新,可用于执行update insert delete 语句
     *
     * @param request sql请求
     * @return 影响的记录条数
     * @see SqlRequests
     */
    int update(SqlRequest request);

    /**
     * 执行查询语句
     * <pre>
     *   sqlExecutor.select(of("select * from user where name = ?",name),single(map()));
     * </pre>
     *
     * @param request SQL请求
     * @param wrapper 查询结果包装器
     * @param <T>     行类型
     * @param <R>     结果类型
     * @return 查询结果
     * @see SqlRequests
     * @see ResultWrappers
     */
    <T, R> R select(SqlRequest request, ResultWrapper<T, R> wrapper);

    default int update(String sql, Object... args) {
        return update(SqlRequests.of(sql, args));
    }

    default <T, R> R select(String sql, ResultWrapper<T, R> wrapper) {
        return select(SqlRequests.of(sql), wrapper);
    }

    default List<Map<String, Object>> select(String sql, Object... args) {
        return select(SqlRequests.of(sql, args), ResultWrappers.mapList());
    }
}
